home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Taifun
/
Taifun 025 (1987-08-15)(Ossowski, Stefan)(DE)(PD).zip
/
Taifun 025 (1987-08-15)(Ossowski, Stefan)(DE)(PD).adf
/
Graph
/
func.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-03-08
|
15KB
|
655 lines
/****************************************************************************/
/* Program: Graph It II (The C Program) */
/* SubModule: func.c 1-7-87 */
/* CopyRight By Flynn D. Fishman January 1987 */
/* Feel Free to copy and alter this source */
/****************************************************************************/
/* This function includes all of the math related subroutines to solve all
the graph related problems */
#include "graph.h"
static char *(functions[]) = {"xx", "tt", "yy", "zz", "((", "))",
"++", "--", "//", "^^", "==", "**",
"ccos", "ssin", "Ttan", "eexp", "PPI", "EE",
"aatan", "Sasin", "Cacos", "lln", "Aabs", "Ll",
"end"};
double Solve(formula)
struct Formula_Master *formula;
{
extern double x, y, z, t;
double lop, a, b, total;
char func;
a = 0;
b = 0;
total = Value(formula);
while (formula->equation[formula->position] != '0' )
{
func = formula->equation[formula->position++];
if (func == 0) break;
switch (func)
{
case '+':
total = total + Value(formula);
break;
case '-':
total = total - Value(formula);
break;
case '*':
total = total * Value(formula);
break;
case '/':
a = Value(formula);
if (a != 0) total = total / a;
else total = INFINITY;
break;
case '^':
total = pow(total, Value(formula) );
break;
case '=':
total = (total == Value(formula) );
break;
case '\)':
return(total);
break;
default:
formula->error = INVALID;
return(0);
} /* end of case */
} /* end of while */
return (total);
} /* end of Solve */
double Value(formula)
struct Formula_Master *formula;
{
extern double x, y, z, t;
int whichfunc, position;
double a,b;
char test, bitmask, tmp, lowmask, highbit;
position = formula->position;
test = formula->equation[formula->position];
if (test == '\(')
{
formula->position++;
return(Solve(formula));
}
tmp = (test & HIGHBIT);
if (tmp != 0)
{
return (
formula->constants[
LOWMASK & formula->equation[formula->position++]
]
);
}
formula->position++;
switch (test)
{
case '\(': /* ( */
return(Solve(formula));
break;
case 'x': /* X */
return(x);
break;
case 'y': /* Y */
return(y);
break;
case 't': /* T */
return(t);
break;
case 'z': /* Z */
return(z);
break;
case 'c': /* Cos */
return (cos ( Value (formula) ) );
break;
case 's': /* Sin */
return (sin ( Value (formula) ) );
break;
case 'T': /* Tan */
return (tan ( Value (formula) ) );
break;
case 'e': /* E to the x */
return ( exp ( Value(formula) ) );
break;
case 'P': /* PI */
return ( PI );
break;
case 'E': /* E to the x */
return ( exp (1.0) );
break;
case 'l': /* ln */
return ( log ( Value(formula) ) );
break;
case 'a': /* Atan */
return ( atan ( Value(formula) ) );
break;
case 'S': /* Asin */
return ( asin ( Value(formula) ) );
break;
case 'C': /* Acos */
return ( acos ( Value(formula) ) );
break;
case 'A': /* abs */
return ( abs ( Value(formula) ) );
break;
default:
formula->error = UNKNOWN;
return(0);
} /* end of switch */
} /* end of routine */
GetFunction(infile, formula)
FILE *infile;
struct Formula_Master *formula;
{
char text[50], inchar;
double a;
int position, lasttype, function, constants, whichfunc;
position = 0;
function = 0;
constants = 0;
while ( (inchar = getc(infile) ) == ' ');
lasttype = Type(inchar);
for ever
{
if ((lasttype == Type(inchar)) && (inchar != ' '))
{
text[position++] = inchar;
}
else
{
text[position] = 0;
if (lasttype == ALPHA)
{
for (whichfunc = 0;
strcmp(text, &functions[whichfunc][1]) ;
whichfunc++)
{
if (!strcmp( functions[whichfunc], "end") )
{
return(FALSE);
}
}
formula->equation[function++] = functions[whichfunc][0];
}
if (lasttype == NUMERIC)
{
formula->equation[function++] = (HIGHBIT | constants);
sscanf(text, "%f", &a );
formula->constants[constants++] = a;
}
if (lasttype == OTHER)
{
position = 0;
while (text[position] !=0)
{
formula->equation[function++] = text[position++];
}
}
if (inchar == ' ') while ( (inchar = getc(infile) ) == ' ');
position = 0;
text[position++] = inchar;
lasttype = Type(inchar);
} /* end of else */
if (lasttype == END) break;
inchar = getc(infile);
} /* end of forever */
formula->equation[function] = 0;
if (function == 0)
{
FreeFunction(formula);
return(FALSE);
}
return(TRUE);
} /* end of routine */
Type(character)
char character;
{
if(character >= 'a' && character <= 'z') return (ALPHA);
if(character >= 'A' && character <= 'Z') return (ALPHA);
if(character >= '0' && character <= '9') return (NUMERIC);
if(character == '.') return (NUMERIC);
if(character == ';' || character == '\n' || character == '\r'
|| character == EOF) return(END);
return(OTHER);
}
SetDefaults(parameters)
struct Graph_Parameters *parameters;
{
parameters->end = FALSE;
parameters->xstart = -5.0;
parameters->ystart = -5.0;
parameters->zstart = -5.0;
parameters->tstart = -5.0;
parameters->xend = 5.0;
parameters->yend = 5.0;
parameters->zend = 5.0;
parameters->tend = 5.0;
parameters->xlabels = 1.0;
parameters->ylabels = 1.0;
parameters->zlabels = 1.0;
parameters->detail = 1.0;
}
GetVariables(Window, parameters, infile)
struct Window *Window;
struct Graph_Parameters *parameters;
FILE *infile;
{
char inchar, variable, command;
double number;
long int minx, miny, maxx, maxy;
minx = Window->BorderLeft;
miny = Window->BorderTop;
maxx = Window->Width - Window->BorderRight - XBORDER;
maxy = Window->Height - Window->BorderBottom - YBORDER;
for ever
{
DrawRectangle(Window, 1l, minx, miny, maxx, miny+110);
DisplayVariables(Window, parameters);
variable = getc(infile);
if (variable == '\r' || variable == '\n' || variable == 'e') break;
if (variable != 'd' || variable != 'h' ) command = getc(infile);
if (command == '=' || variable == 'h') command = '1';
else while ( (inchar = getc(infile) ) != '=' );
if (command < '0' || command > '9')
{
number = GetNum(infile);
if (number != 0.0)
{
if(variable== 'd') parameters->detail = number;
if(variable== 'h')
parameters->hidden = (parameters->hidden) ? FALSE : TRUE;
if(variable== 'x' && command== 's')parameters->xstart = number;
if(variable== 'x' && command== 'e')parameters->xend = number;
if(variable== 'x' && command== 'l')parameters->xlabels =number;
if(variable== 'y' && command== 's')parameters->ystart = number;
if(variable== 'y' && command== 'e')parameters->yend = number;
if(variable== 'y' && command== 'l')parameters->ylabels =number;
if(variable== 'z' && command== 's')parameters->zstart = number;
if(variable== 'z' && command== 'e')parameters->zend = number;
if(variable== 'z' && command== 'l')parameters->zlabels =number;
if(variable== 't' && command== 's')parameters->tstart = number;
if(variable== 't' && command== 'e')parameters->tend = number;
} /* end of 0.0 else */
} /* end of if not equation */
else /* Its a formula */
{
if (variable == 'x')
{
if (!parameters->xon) parameters->x1 = AllocateFunction();
if (parameters->x1 != NULL)
{
if (!GetFunction(infile, parameters->x1))
{
parameters->xon = FALSE;
error(Window, FALSE);
}
else
{
parameters->xon = TRUE;
parameters->x1->position=0;
parameters->x1->error = FALSE;
Solve(parameters->x1);
if (parameters->x1->error != FALSE)
error(Window, parameters->x1->error);
}
}
} /* end of x = */
if (variable == 'y')
{
if (!parameters->yon) parameters->y1 = AllocateFunction();
if (parameters->y1 != NULL)
{
if (!GetFunction(infile, parameters->y1))
{
parameters->yon = FALSE;
error(Window, FALSE);
}
else
{
parameters->yon = TRUE;
parameters->y1->position=0;
parameters->y1->error = FALSE;
Solve(parameters->y1);
if (parameters->y1->error != FALSE)
error(Window, parameters->y1->error);
}
}
} /* end of y = */
if (variable == 'z')
{
if (!parameters->zon) parameters->z1 = AllocateFunction();
if (parameters->z1 != NULL)
{
if (!GetFunction(infile, parameters->z1))
{
parameters->zon = FALSE;
error(Window, FALSE);
}
else
{
parameters->zon = TRUE;
parameters->z1->position=0;
parameters->z1->error = FALSE;
Solve(parameters->z1);
if (parameters->z1->error != FALSE)
error(Window, parameters->z1->error);
}
}
} /* end of z = */
} /* end of else */
} /* end of for ever */
} /* end of command */
error(Window, error)
struct Window *Window;
int error;
{
long int minx, miny, maxx, maxy;
minx = Window->BorderLeft;
miny = Window->BorderTop;
maxx = Window->Width - Window->BorderRight - XBORDER;
maxy = Window->Height - Window->BorderBottom - YBORDER;
DrawRectangle(Window, 3l, minx, miny+10, maxx, miny+115);
SetAPen(Window->RPort, 1l);
if (error == INVALID) Print(Window, "Invalid Function was entered", 13l);
else if (error == UNKNOWN)
Print(Window, "An unknown Function was entered", 13l);
else if (error == FALSE)
Print(Window, "An unknown Function was entered", 13l);
}
double GetNum(infile)
FILE *infile;
{
char inchar, text[20];
int position;
double a;
position = 0;
inchar = getc(infile);
while (Type(inchar) != END)
{
text[position++] = inchar;
inchar = getc(infile);
}
text[position] = 0;
sscanf(text, "%f", &a );
return(a);
}
char *AllocateFunction()
{
struct Formula_Master *formula;
formula = AllocMem( (long) sizeof(struct Formula_Master), 0);
if (formula == NULL) return(0);
formula->equation = AllocMem(sizeof(char) * FSIZE , 0);
if (formula->equation == NULL) return(0);
formula->constants = AllocMem(sizeof(double) * CONSTANTS , 0);
if (formula->constants == NULL) return(0);
return(formula);
}
FreeFunction(formula)
struct Formula_Master *formula;
{
FreeMem(formula->equation, sizeof(char) * FSIZE);
FreeMem(formula->constants, sizeof(double) * CONSTANTS);
FreeMem(formula, sizeof (struct Formula_Master) );
}
GetCommand(Window, parameters)
struct Window *Window;
struct Graph_Parameters *parameters;
{
FILE *infile;
char list[80];
infile = fopen("con:0/140/640/36/Enter Command", "r");
if (infile == NULL)
{
parameters->error = WINDOW;
return(0);
}
GetVariables(Window, parameters, infile);
fclose(infile);
}
LoadFile(Window, parameters)
struct Window *Window;
struct Graph_Parameters *parameters;
{
FILE *infile;
char line[80], file[40];
GetFileName(line);
infile = fopen(line, "r");
if (infile == NULL) return();
GetVariables(Window, parameters, infile);
fclose(infile);
}
SaveFile(Window, parameters)
struct Window *Window;
struct Graph_Parameters *parameters;
{
FILE *outfile;
char line[80], file[40];
GetFileName(line);
outfile = fopen(line, "w");
if (outfile == NULL) return();
fprintf(outfile, "xstart=%f\n", parameters->xstart);
fprintf(outfile, "ystart=%f\n", parameters->ystart);
fprintf(outfile, "zstart=%f\n", parameters->zstart);
fprintf(outfile, "tstart=%f\n", parameters->tstart);
fprintf(outfile, "xend=%f\n", parameters->xend);
fprintf(outfile, "yend=%f\n", parameters->yend);
fprintf(outfile, "zend=%f\n", parameters->zend);
fprintf(outfile, "tend=%f\n", parameters->tend);
fprintf(outfile, "xlabels=%f\n", parameters->xlabels);
fprintf(outfile, "ylabels=%f\n", parameters->ylabels);
fprintf(outfile, "zlabels=%f\n", parameters->zlabels);
fprintf(outfile, "detail=%f\n", parameters->detail);
if(parameters->xon)
{
Expand(parameters->x1, line);
fprintf(outfile, "x1=%s\n", line);
}
if(parameters->yon)
{
Expand(parameters->y1, line);
fprintf(outfile, "y1=%s\n", line);
}
if(parameters->zon)
{
Expand(parameters->z1, line);
fprintf(outfile, "z1=%s\n", line);
}
fprintf(outfile,"e\n");
fclose(outfile);
}
GetFileName(line)
char line[];
{
FILE *infile;
char inchar;
int position;
infile = fopen("con:0/140/640/24/Please Enter Filename:", "r");
if (infile == NULL) return(0);
position = 0;
inchar = getc(infile);
while ( Type(inchar) != END)
{
line[position++] = inchar;
inchar = getc(infile);
}
line[position] = 0;
fclose(infile);
}
DisplayVariables(Window, parameters)
struct Window *Window;
struct Graph_Parameters *parameters;
{
char line[80], tmp[80];
SetAPen(Window->RPort, 3l);
SetBPen(Window->RPort, 0l);
SetDrMd(Window->RPort, JAM2);
Print(Window, "Current Variable Settings", 0);
sprintf(line, " start end labels other ");
Print(Window, line, 1);
sprintf(line,"x:%4.6f %4.6f %4.6f",parameters->xstart, parameters->xend,
parameters->xlabels);
Print(Window, line, 2);
sprintf(line, "y:%4.6f %4.6f %4.6f", parameters->ystart, parameters->yend,
parameters->ylabels);
Print(Window, line, 3);
sprintf(line, "z:%4.6f %4.6f %4.6f", parameters->zstart, parameters->zend,
parameters->zlabels);
Print(Window, line, 4);
sprintf(line, "t:%4.6f %4.6f N/A", parameters->tstart, parameters->tend);
Print(Window, line, 5);
sprintf(line, "Detail is %4.6f", parameters->detail);
Print(Window, line, 6);
if(parameters->hidden) Print(Window, "Hidden lines is ON ", 7);
else Print(Window, "Hidden lines is OFF", 7);
if (parameters->xon)
{
Expand(parameters->x1, line);
sprintf(tmp, "x=");
strcat (tmp, line);
strcat (tmp, " ");
Print(Window, tmp, 9);
}
if (parameters->yon)
{
Expand(parameters->y1, line);
sprintf(tmp, "y=");
strcat (tmp, line);
strcat (tmp, " ");
Print(Window, tmp, 10);
}
if (parameters->zon)
{
Expand(parameters->z1, line);
sprintf(tmp, "z=");
strcat (tmp, line);
strcat (tmp, " ");
Print(Window, tmp, 11);
}
}
Expand(formula, line)
struct Formula_Master *formula;
char line[];
{
int loop, position;
char tmp[30];
line[0]=0;
for (position = 0; position < strlen(formula->equation); position++)
{
if ((formula->equation[position] & HIGHBIT) != 0)
{
sprintf(tmp, "%f",
formula->constants[LOWMASK & formula->equation[position]]);
strcat(line, tmp);
}
else
{
loop = 0;
/* is this wrong ? */
while (strcmp(functions[loop], "end") )
{
if (functions[loop][0] == formula->equation[position])
strcat(line, &functions[loop][1]);
loop++;
} /* end of while */
} /* end of else */
} /* end of for */
} /* end of the routine */